<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const map = new Map()
        map.set('name','Lucy')
        map.set({a:1}, '{a:1}')
        console.log(map.get('name')) // Lucy
        console.log(map.get({a:1})) // undefined  因为在 js 中 {a:1} 不等于 {a:1}。如果需要用对象作为 key，需要使用其引用
        
        const obj = {b: 2}
        map.set(obj, '{b:2}')
        console.log(map.get(obj)) // {b:2}

        // 注意，Map 定义的以对象指针为 key 的散列，如果指针指向了其他对象，其原指针指向内容作为key的键值对将永远残留在 map 中，造成内存泄漏
        let obj2 = {c:3}
        map.set(obj2, '{c:3}')
        console.log(map)
        console.log(map.get(obj2)) // {c:3}
        obj2 = '666'
        console.log(map.get(obj2)) // undefined
        console.log(map) // value 为 {c:3} 的键值对依旧在散列中


        // WeakMap 产生的 map 只能接收以对象为key的键值对，且如果 key 为 null，该键值对会从散列中去除
        const weakmap = new WeakMap()
        let obj3 = {d:4}
        weakmap.set(obj3, '{d:4}')
        console.log(weakmap)
        console.log(weakmap.get(obj3)) // {c:3}
        obj3 = null
        console.log(weakmap.get(obj3)) // undefined
        console.log(weakmap) // 空散列
    </script>
</body>
</html>